package com.ictest.detectionflow.mobile;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.ictest.detectionflow.mobile.model.Component;

/**
 * 元器件详细信息。
 * 
 * @author zanezeng
 * 
 */
public class ComponentDetailActivity extends Activity
{
	// 数据库辅助对象
	private DatabaseHelper m_Helper;

	/**
	 * 日志标记。
	 */
	private final static String LOG_TAG = "ComponentDetailActivity";

	/**
	 * 详细信息适配器。
	 */
	private ComponentDetailAdapter m_DetailAdapter;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		// 调用基类实现
		super.onCreate(savedInstanceState);

		// 创建数据库辅助类
		this.m_Helper = new DatabaseHelper(this);

		// 设置内容视图
		setContentView(R.layout.activity_component_detail);

		// 获得返回按钮
		ImageButton cmdBack = (ImageButton) this.findViewById(R.id.cmdBack);

		// 挂接点击事件监听
		cmdBack.setOnClickListener(new View.OnClickListener()
		{
			// 处理点击事件
			public void onClick(View v)
			{
				// 结束页面
				ComponentDetailActivity.this.finish();
			}
		});

		// 获得进度条
		ProgressBar prgLoadding = (ProgressBar) this.findViewById(R.id.prgLoadding);

		// 显示进度条
		prgLoadding.setVisibility(View.VISIBLE);

		// 获得元器件列表视图
		ListView lstComponent = (ListView) this.findViewById(R.id.lstComponent);

		// 隐藏列表
		lstComponent.setVisibility(View.INVISIBLE);

		// 创建元器件列表视图适配器
		this.m_DetailAdapter = new ComponentDetailAdapter();

		// 设置列表视图适配器
		lstComponent.setAdapter(this.m_DetailAdapter);

		// 获得编号
		String id = this.getIntent().getExtras().getString("ID");

		// 创建查询任务
		ComponentDetailActivity.DetailQueryTask task = new ComponentDetailActivity.DetailQueryTask();

		// 启用同步任务
		task.execute(id);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		return true;
	}

	/**
	 * 使用指定的实体信息填充界面。
	 * 
	 * @param entity
	 *            用于填充解码的实体信息。
	 */
	private void fillData(Component entity)
	{
		// 获得进度条
		ProgressBar prgLoadding = (ProgressBar) this.findViewById(R.id.prgLoadding);

		// 隐藏进度条
		prgLoadding.setVisibility(View.INVISIBLE);

		// 获得元器件列表视图
		ListView lstComponent = (ListView) this.findViewById(R.id.lstComponent);

		// 显示列表
		lstComponent.setVisibility(View.VISIBLE);

		// 刷新数据
		this.m_DetailAdapter.updateDataSet(entity);
	}

	/**
	 * 元器件详细信息列表视图适配器。
	 */
	/**
	 * @author zanezeng
	 * 
	 */
	private class ComponentDetailAdapter extends BaseAdapter
	{
		/**
		 * 日志标记。
		 */

		/**
		 * 用于记录数据的总数。
		 */
		private int m_Count = 0;

		/**
		 * 当前实体。
		 */
		private Component m_Entity;

		/**
		 * 标题资源列表
		 */
		private final int[] TITLE_RESOURCES = new int[] { R.string.label_code, R.string.label_name, R.string.label_manufacturer, R.string.label_package, R.string.label_grade, R.string.label_mark,
				R.string.label_storage, R.string.label_working, R.string.label_memo, R.string.label_pind, R.string.label_leakhunting, R.string.label_testable };

		/**
		 * 文字视图类型。
		 */
		private static final int TYPE_TEXT = 0;

		/**
		 * 图片视图类型。
		 */
		private static final int TYPE_IMAGE = 1;

		/**
		 * 图片视图类型。
		 */
		private static final int TYPE_CHECKBOX = 2;

		/**
		 * 布局对象。
		 */
		private final LayoutInflater m_Inflater;

		/**
		 * 构造函数。
		 */
		public ComponentDetailAdapter()
		{
			// 获得布局对象
			this.m_Inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		/**
		 * 获得记录的总数。
		 */
		public int getCount()
		{
			// 返回记录总数
			return this.m_Count;
		}

		/**
		 * 获得指定位置的数据对象。
		 */
		public Object getItem(int position)
		{
			return position;
		}

		/**
		 * 获得指定位置的数据对象的编号。
		 */
		public long getItemId(int position)
		{
			// 默认返回位置
			return position;
		}

		@Override
		public int getViewTypeCount()
		{
			// 返回视图类型数目
			return 3;
		}

		@Override
		public int getItemViewType(int position)
		{
			// 判断是否为文字视图
			if (position < this.TITLE_RESOURCES.length - 3)
			{
				return TYPE_TEXT;
			}
			else if (position < this.TITLE_RESOURCES.length)
			{
				return TYPE_CHECKBOX;
			}
			else
			{
				// 返回图片视图
				return TYPE_IMAGE;
			}
		}

		@Override
		public boolean isEnabled(int position)
		{
			// 总是允许
			return true;
		}

		/**
		 * 获得指定位置元素的显示视图。
		 */
		public View getView(int position, View convertView, ViewGroup parent)
		{
			// 获得视图类型
			int viewType = this.getItemViewType(position);

			// 判断是否为文字视图
			if (viewType == TYPE_TEXT)
			{
				// 判断文字视图是否创建
				if (null == convertView)
				{
					// 保存文字视图
					convertView = this.m_Inflater.inflate(R.layout.listitem_component_detail, null);
				}

				// 获得名称控件
				TextView txtName = (TextView) convertView.findViewById(R.id.txtName);

				// 获得标题内容
				String value = ComponentDetailActivity.this.getString(this.TITLE_RESOURCES[position]);

				// 设置名称
				txtName.setText(value);

				// 获得值控件
				TextView txtValue = (TextView) convertView.findViewById(R.id.txtValue);

				// 根据位置设置数据
				switch (position)
				{
				case 0:
					// 设置数据
					txtValue.setText(this.m_Entity.getCode());
					// 终止
					break;
				case 1:
					// 设置数据
					txtValue.setText(this.m_Entity.getName());
					// 终止
					break;
				case 2:
					// 设置数据
					txtValue.setText(this.m_Entity.getManufacturer());
					// 终止
					break;
				case 3:
					// 设置数据
					txtValue.setText(this.m_Entity.getPackage());
					// 终止
					break;
				case 4:
					// 设置数据
					txtValue.setText(this.m_Entity.getGrade());
					// 终止
					break;

				case 5:
					// 设置数据
					txtValue.setText(this.m_Entity.getMark());
					// 终止
					break;

				case 6:
					// 设置数据
					txtValue.setText(this.m_Entity.getStorageTemperature());
					// 终止
					break;

				case 7:
					// 设置数据
					txtValue.setText(this.m_Entity.getWorkingTemperature());
					// 终止
					break;

				case 8:
					// 设置数据
					txtValue.setText(this.m_Entity.getMemo());
					// 终止
					break;
				}
			}
			// 判断是否为文字视图
			else if (viewType == TYPE_CHECKBOX)
			{
				// 判断文字视图是否创建
				if (null == convertView)
				{
					// 保存文字视图
					convertView = this.m_Inflater.inflate(R.layout.listitem_component_detail_checkbox, null);
				}

				// 获得名称控件
				TextView txtName = (TextView) convertView.findViewById(R.id.txtName);

				// 获得标题内容
				String value = ComponentDetailActivity.this.getString(this.TITLE_RESOURCES[position]);

				// 设置名称
				txtName.setText(value);

				// 获得值控件
				CheckBox txtValue = (CheckBox) convertView.findViewById(R.id.txtValue);

				// 根据位置设置数据
				switch (position)
				{
				case 9:
					// 设置数据
					txtValue.setChecked(this.m_Entity.getPIND());
					// 终止
					break;
				case 10:
					// 设置数据
					txtValue.setChecked(this.m_Entity.getLeakHunting());
					// 终止
					break;
				case 11:
					// 设置数据
					txtValue.setChecked(this.m_Entity.getIsTestable());
					// 终止
					break;
				}
			}
			else
			{
				// 判断图片视图是否创建
				if (null == convertView)
				{
					// 保存文字视图
					convertView = this.m_Inflater.inflate(R.layout.listitem_component_thumb, null);
				}

				// 用于保存图片数据
				byte[] data = null;

				// 获得照片数据
				switch (position)
				{
				case 12:
					// 获得数据
					data = this.m_Entity.getPicture1();
					// 终止
					break;
				case 13:
					// 获得数据
					data = this.m_Entity.getPicture2();
					// 终止
					break;
				case 14:
					// 获得数据
					data = this.m_Entity.getPicture3();
					// 终止
					break;
				case 15:
					// 获得数据
					data = this.m_Entity.getPicture4();
					// 终止
					break;
				}

				// 获得图片控件
				ImageView imgThumb = (ImageView) convertView.findViewById(R.id.imgThumb);

				// 判断是否有数据
				if (null != data && data.length > 0)
				{
					try
					{
						// 生成缩略图
						Bitmap thumb = BitmapFactory.decodeByteArray(data, 0, data.length);
						// 设置缩略图
						imgThumb.setImageBitmap(thumb);
					}
					catch (Exception ex)
					{
						// 记录日志
						Log.e(LOG_TAG, ex.toString());

						// 设置图片
						imgThumb.setImageDrawable(getResources().getDrawable(R.drawable.default_thumb));
					}
				}
				else
				{
					// 设置图片
					imgThumb.setImageDrawable(getResources().getDrawable(R.drawable.default_thumb));
				}
			}

			// 返回视图
			return convertView;
		}

		/**
		 * 更新数据集合。
		 * 
		 * @param cursor
		 *            数据游标。
		 * @param count
		 *            数据总数。
		 */
		public void updateDataSet(Component entity)
		{
			// 保存实体
			this.m_Entity = entity;
			// 清除总数
			this.m_Count = 0;

			// 判断当前游标是否存在
			if (this.m_Entity != null)
			{
				// 计算总数
				this.m_Count = this.TITLE_RESOURCES.length;

				// 判断是否有图片
				if (!this.isEmpty(this.m_Entity.getPicture1()))
				{
					// 增加一项
					this.m_Count += 1;
				}

				// 判断是否有图片
				if (!this.isEmpty(this.m_Entity.getPicture2()))
				{
					// 增加一项
					this.m_Count += 1;
				}

				// 判断是否有图片
				if (!this.isEmpty(this.m_Entity.getPicture3()))
				{
					// 增加一项
					this.m_Count += 1;
				}

				// 判断是否有图片
				if (!this.isEmpty(this.m_Entity.getPicture4()))
				{
					// 增加一项
					this.m_Count += 1;
				}

			}

			// 通知数据集发生变化
			this.notifyDataSetChanged();
		}

		/**
		 * 判断指定的数组是否为空。
		 * 
		 * @param data
		 *            用于判断的数组。
		 * @return 如果为空，则返回true，否则返回false。
		 */
		private boolean isEmpty(byte[] data)
		{
			return (data == null || data.length == 0);
		}
	}

	/**
	 * 数据检索任务。
	 * 
	 * @author zanezeng
	 */
	private class DetailQueryTask extends AsyncTask<String, String, Component>
	{
		/**
		 * 日志标记。
		 */
		private final static String LOG_TAG = "DetailQueryTask";

		/**
		 * 查询的过程中发生的错误。
		 */
		private Exception m_QueryException;

		@Override
		protected void onPreExecute()
		{
		}

		@Override
		protected Component doInBackground(String... params)
		{
			// 用于保存数据库对象
			SQLiteDatabase database = null;

			// 用于保存游标对象
			Cursor cursor = null;

			try
			{

				// 获得数据库对象
				database = ComponentDetailActivity.this.m_Helper.getReadableDatabase();

				// 获得查询字符串
				String query = ComponentDetailActivity.this.getString(R.string.sql_query_component_detail);

				// 查询数据
				cursor = database.rawQuery(query, params);

				// 判断是否有数据库
				if (cursor.moveToFirst())
				{
					// 创建元器件信息
					Component entity = new Component();

					// 设置属性
					entity.setID(cursor.getString(0));
					entity.setCode(cursor.getString(2));
					entity.setName(cursor.getString(3));
					entity.setMark(cursor.getString(4));
					entity.setPackage(cursor.getString(5));
					entity.setGrade(cursor.getString(6));
					entity.setCategory(cursor.getString(7));
					entity.setManufacturer(cursor.getString(8));
					entity.setStorageTemperature(cursor.getString(9));
					entity.setWorkingTemperature(cursor.getString(10));
					entity.setMemo(cursor.getString(11));
					entity.setPicture1(cursor.getBlob(12));
					entity.setPicture2(cursor.getBlob(13));
					entity.setPicture3(cursor.getBlob(14));
					entity.setPicture4(cursor.getBlob(15));
					entity.setPIND(cursor.getInt(16) == 0 ? false : true);
					entity.setLeakHunting(cursor.getInt(17) == 0 ? false : true);
					entity.setIsTestable(cursor.getInt(18) == 0 ? false : true);

					// 返回实体
					return entity;
				}
			}
			catch (Exception ex)
			{
				// 记录日志
				Log.e(DetailQueryTask.LOG_TAG, ex.toString());

				// 记录同步过程中发生的异常
				this.m_QueryException = ex;
			}
			finally
			{
				// 关闭游标
				if (null != cursor)
				{
					cursor.close();
				}

				// 关闭数据库对象
				if (null != database)
				{
					database.close();
				}
			}

			// 默认返回空引用
			return null;
		}

		@Override
		protected void onProgressUpdate(String... values)
		{
		}

		/**
		 * 同步任务后置处理器。
		 */
		@Override
		protected void onPostExecute(Component result)
		{
			// 判断是否有异常
			if (null != this.m_QueryException)
			{
				// 提示完成
				Toast.makeText(ComponentDetailActivity.this, "查询失败，查询数据的过程中发生错误\r\n" + this.m_QueryException.getMessage(), Toast.LENGTH_SHORT).show();
			}

			// 更新数据集合
			ComponentDetailActivity.this.fillData(result);
		}
	}
}
